篇首语:本文由编程笔记#小编为大家整理,主要介绍了计算机网络测试人关于TCP的学习和梳理相关的知识,希望对你有一定的参考价值。
通过阅读《计算机网络–自顶向下方法》,以及结合最近面试的一些经历,作此笔记进行梳理和总结,也为日后的回顾作基底。
运输层(Transport Layer)位于应用层和网络层之间,该层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能。
- 即应用进程使用运输层提供的逻辑通信功能彼此发送报文,而无须考虑承载这些报文的物理基础设施的细节。
- 运输层和网络层的关系:运输层位于网络层之上,网络层提供主机之间的逻辑通信服务,运输层为运行在不同主机上的进程之间提供逻辑通信服务。
- 关于网络层级架构具体介绍可移步《【计算机网络】OSI与TCP/IP网络架构》。
运输层协议在端系统中实现:
*面试常问之TCP和HTTP的联系和区别
联系:
- HTTP协议的数据一般是基于TCP协议进行传输的。
- 关于HTTP的详细介绍可移步《【计算机网络】测试人关于HTTP的学习和梳理》。
区别:
HTTP属于应用层协议,定义了传输数据内容的规范。
TCP属于运输层协议,定义了数据传输和连接方式的规范。
HTTP算是短连接,TCP算是长连接。
因特网有两种协议(TCP和UDP),可为调用的应用程序提供一组不同的传输层服务。
TCP和UDP最基本的责任是将两个端系统间IP的交付服务扩展成运行在端系统上的两个进程之间的交付服务,即运输层的多路复用和多路分解:
网络层协议(IP,网际协议)为主机之间提供逻辑通信,其服务模型是尽力而为交付服务(best-effort delivery
service)。
- 因为其不确保报文段的交付,不保证报文段的按序交付,不保证报文段中的数据的完整性,因此也被称为不可靠服务(unreliable service)。
TCP服务模型是一个字节流,TCP必须检测并修补所有在IP层(及下面的层)产生的数据传输问题,如丢包、重复以及错误。
一个TCP连接通常分为3个阶段:启动、数据传输、退出(关闭)。
- 一个TCP连接由一对端点或套接字构成,通信的每一端都由一对(IP地址、端口号)所唯一标识。
*面试常问之为什么是三次握手而不是两次?
为了防止已失效的连接请求报文段突然又传送到了,因而产生错误。
- 详细原因:如果在发送过程中的话,假如是两次:
- 当A给B发送一个连接请求,因为网络的原因该请求没有按时到达,A就会重新发送一次请求,这次请求正常到,然后B就会给A一个确认请求,此时就可以传送数据了。
- 但是当A第一次发送的数据又来到了(A以为这个包已经丢失了),那么B就会再次向A发送一个确认,此时的A就不知道这个确认的意义了,而B就会在一直等待着A给他发送信息(如果这样的次数很多就会导致资源浪费)。
- 所以不能是两次。
*面试常问之为什么是四次挥手而不是三次?
因为TCP连接是全双工的,也就是说接收到FIN只是说没有数据再发过来,但是还是可以向对方发送数据的,也就是说接受到一个FIN只是关闭了一个方向的数据传输,另一个方向还可以继续发送数据。
前两次挥手只是确认关闭了一个方向的数据,加上后面两次挥手才真正的关闭了整个全双工连接。
当socket在ESTABISHED状态时,它想主动关闭连接于是向对方发送FIN请求,发送完FIN请求后它处于FIN_WAIT_1状态,当对方确认ACK报文后则处于FIN_WAIT_2状态。
- FIN_WAIT_2表示半连接,也就是有一方要求关闭连接,另一方收到请求但是告诉它我还有一些数据要发送稍后会关闭。
- TIME_WAIT状态表示收到对方的FIN并发送出ACK。
如果是三次挥手,则可能在关闭后还有一个方向没有关。
*面试常问之2MSL:
客户端接收到服务器端的 FIN 报文后进入TIME_WAIT状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文
发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。
发送方按照顺序给要发送的数据包的每个字节都标上编号。
接收方接收到发送方的数据包之后,回传一个ACK信号,标识下一个需求的数据包初始字节编号。
发送方没有接收到响应的ACK报文原因可能有两点:
- 数据在传输过程中由于网络原因等直接全体丢包,接收方没有接收到。
- 接收方接收到了响应的数据,但是发送的ACK报文响应却由于网络原因丢包了。
TCP在解决这个问题的时候引入了一个新的机制,叫做超时重传机制。
发送方在发送完数据后等待一个时间,该时间内没有接收到ACK报文,那么就会重新发送刚才的数据。
TCP必需要解决的可靠传输以及包乱序(reordering)的问题,所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包。
发送方滑动窗口示意图:
分成了四个部分,分别是(其中那个黑模型就是滑动窗口):
- 已收到ack确认的数据。
- 已发出但还没收到ack的。
- 在窗口中还没有发出的(接收方还有空间)。
- 窗口以外的数据(接收方没空间)。
下面是个滑动后的示意图(收到36的ack,并发出了46-51的字节):
滑动窗口中窗口前段为已发送但为收到ACK的数据,后段为待发送数据。
接收端在接收到数据后,对其进行处理。
- 如果发送端的发送速度太快,导致接收端的结束缓冲区很快的填充满了。此时如果发送端仍旧发送数据,那么接下来发送的数据都会丢包,继而导致丢包的一系列连锁反应,如超时重传。
而TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。
简单来说就是接收方处理不过来的时候,就把窗口缩小,并把窗口值告诉发送端。
- 如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。
- 这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
- 发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。
发送端通过拥塞窗口主动控制传输流量。主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。
慢开始:防止双方通信刚开始就传送大量数据包,发送端拥塞窗口初始设置为1MSS(以报文段而非字节为单位),每接受一个ACK信号,窗口扩大为两倍。
拥塞避免:
TCP以段为单位发送数据包:在建立TCP连接的同时,两端协商发送数据包的单位,称为“最大消息长度”:MSS。
- 【TCP数据(MSS字节)】【TCP首部(20字节)】【IP首部(20字节)】
【部分内容参考自】